using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;

namespace SkypeStudio.CustomControl
{
    public class MultiLineListBox : System.Windows.Forms.ListBox
    {
        public MultiLineListBox()
		{
			this.DrawMode = DrawMode.OwnerDrawVariable;
			//this.ScrollAlwaysVisible = true;
            //tbox.Hide();
            //tbox.mllb = this;
            //Controls.Add(tbox);
			
		}
        protected override Rectangle GetScaledBounds(Rectangle bounds, SizeF factor, BoundsSpecified specified)
        {
            return base.GetScaledBounds(bounds, factor, specified);
        }
        protected override void OnMeasureItem(MeasureItemEventArgs e)
        {
            //if (Site != null)
            //    return;
            //if (e.Index > -1)
            //{
            //    string s = Items[e.Index].ToString();
            //    SizeF sf = e.Graphics.MeasureString(s, Font, Width);
            //    int htex = (e.Index == 0) ? 15 : 10;
            //    //e.ItemHeight = (int)sf.Height + htex;
            //    e.ItemHeight = 500;

            //    e.ItemWidth = Width;

            //    Debug.WriteLine(string.Format("MeasureItem : e.Index : {0} ,e.Bounds.Width : {1}, e.Bounds.Height : {2}", e.Index, e.ItemWidth, e.ItemHeight));

            //}

            base.OnMeasureItem(e);

        }

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            //if (Site != null)
            //    return;
            //if (e.Index > -1)
            //{
            //    string s = Items[e.Index].ToString();

            //    SizeF sf = e.Graphics.MeasureString(s, Font, Width);

            //    Debug.WriteLine(string.Format("DrawItem : e.Index : {0} ,e.Bounds.Width : {1}, e.Bounds.Height : {2}", e.Index, e.Bounds.Width, e.Bounds.Height));


            //    //e.Bounds.Height = sf.Height;
            //    if ((e.State & DrawItemState.Focus) == 0)
            //    {
            //        e.Graphics.FillRectangle(new SolidBrush(SystemColors.Window), e.Bounds);
            //        e.Graphics.DrawString(s, Font, new SolidBrush(SystemColors.WindowText),
            //            e.Bounds);
            //        e.Graphics.DrawRectangle(new Pen(SystemColors.Highlight), e.Bounds);
            //    }
            //    else
            //    {
            //        e.Graphics.FillRectangle(new SolidBrush(SystemColors.Highlight), e.Bounds);
            //        e.Graphics.DrawString(s, Font, new SolidBrush(SystemColors.HighlightText),
            //            e.Bounds);
            //    }
            //}

            base.OnDrawItem(e);
        }
		
		protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
		{
            //int index = IndexFromPoint(e.X,e.Y);

            //if (index != ListBox.NoMatches &&
            //    index != 65535)
            //{
				
			
            //    if(e.Button == MouseButtons.Right)
            //    {
				
            //        string s = Items[index].ToString();
            //        Rectangle rect = GetItemRectangle(index);
			
            //        tbox.Location = new Point(rect.X,rect.Y);
            //        tbox.Size = new Size(rect.Width,rect.Height);				
            //        tbox.Text = s;				
            //        tbox.index = index;
            //        tbox.SelectAll();
            //        tbox.Show();
            //        tbox.Focus();
            //    }
            //}
			
			base.OnMouseUp(e);
		}
        protected override void OnKeyDown(KeyEventArgs e)
        {
            //if(e.KeyData == Keys.F2)
            //{
            //    int index = SelectedIndex;
            //    if(index == ListBox.NoMatches ||
            //        index == 65535 )
            //    {
            //        if (Items.Count > 0)
            //            index = 0;
            //    }
            //    if(index != ListBox.NoMatches &&
            //        index != 65535 )
            //    {

            //        string s = Items[index].ToString();
            //        Rectangle rect = GetItemRectangle(index);

            //        tbox.Location = new Point(rect.X,rect.Y);
            //        tbox.Size = new Size(rect.Width,rect.Height);				
            //        tbox.Text = s;				
            //        tbox.index = index;
            //        tbox.SelectAll();
            //        tbox.Show();
            //        tbox.Focus();
            //    }
            //}
            base.OnKeyDown(e);
        }

		//NTextBox tbox = new NTextBox();

		class NTextBox : TextBox
		{
			public MultiLineListBox mllb;
			public int index = -1;

			bool errshown = false;
			bool brementer = false;

			public NTextBox()
			{
				Multiline = true;	
				ScrollBars = ScrollBars.Vertical;
			}

			protected override void OnKeyUp(KeyEventArgs e)
			{
				if(brementer)
				{
					Text = "";
					brementer = false;
				}
				base.OnKeyUp(e);
			}

			protected override void OnKeyPress(KeyPressEventArgs e)
			{
				base.OnKeyPress(e);
				
				if(e.KeyChar == 13)
				{
					if(Text.Trim() == "")
					{	
						errshown = true;
						brementer = true;

						MessageBox.Show(
							"Cannot enter NULL string as item!",
							"Fatal error!",MessageBoxButtons.OK,
							MessageBoxIcon.Error);													
					}
					else
					{
						errshown = false;
						mllb.Items[index] = Text;					
						Hide();
					}
					
				}

				if(e.KeyChar == 27)
				{	
					Text = mllb.Items[index].ToString();
					Hide();
					mllb.SelectedIndex = index;
				}
				
			}

			protected override void OnLostFocus(System.EventArgs e)
			{					

				if(Text.Trim() == "")
				{
					if(!errshown)
					{
						MessageBox.Show(
							"Cannot enter NULL string as item!",
							"Fatal error!",MessageBoxButtons.OK,
							MessageBoxIcon.Error);											
					}					
					errshown = false;					
				}
				else
				{
					errshown = false;
					mllb.Items[index] = Text;					
					Hide();
				}	
				base.OnLostFocus(e);
			}		
		}

	
	}	
    
}
